11.3 代码覆盖率
如果说单元测试和性能测试关注代码质量,那么代码覆盖率(code coverage)就是度量测试自身完整和有效性的一种手段。
通过覆盖率值,我们可分析出测试代码的编写质量。检测它是否提供了足够的测试条件,是否执行了足够的函数、语句、分支和代码行等,以此来量化测试本身,让白盒测试真正起到应有的质量保障作用。
当然,这并不是说要追求形式上的数字百分比。关键还是为改进测试提供一个可发现缺陷的机会,毕竟只有测试本身的质量得到保障,才能让它免于成为形式主义摆设。
代码覆盖率也常被用来发现死代码(dead code)。
func TestAdd(t*testing.T) { if add(1,2) !=3{ t.Fatal(“xxx”) } }
输出:
$go test-cover
coverage:100.0%of statements ok test 0.006s
为获取更详细的信息,可指定covermode和coverprofile参数。
- set:是否执行。
- count:执行次数。
- atomic:执行次数,支持并发模式。
$go test-cover-covermode count-coverprofile cover.out
coverage:100.0%of statements ok test 0.007s
$go tool cover-func=cover.out
main.go:5:add 100.0% main.go:9:main 0.0% total: (statements) 50.0%
还可以在浏览器中查看包括具体的执行次数等信息。
$go tool cover-html=cover.out
将鼠标移到具体的代码上,会看到次数提示。